访问控制
    https://help.aliyun.com/document_detail/31867.html?spm=5176.doc31836.6.576.y0sVRi
对OSS的资源访问的分类如下：
    按访问者的角色可分为拥有者访问和第三方用户访问。
        这里的拥有者指的是Bucket的Owner，也称为开发者。
        第三方用户是指访问Bucket里资源的用户。
    按访问者的身份信息可分为匿名访问和带签名访问。
        对于OSS来说，如果请求中没有携带任何和身份相关的信息即为匿名访问。
        带签名访问指的是按照OSS API文档中规定的在请求头部或者在请求URL中携带签名的相关信息。

AccessKey 类型
目前访问 OSS 使用的 AK（AccessKey）有三种类型，具体如下：
    阿里云账号AccessKey
阿里云账号AK特指Bucket拥有者的AK，每个阿里云账号提供的AccessKey对拥有的资源有完全的权限。
        每个阿里云账号能够同时拥有不超过5个active或者inactive的AK对（AccessKeyId和AccessKeySecret）。
        用户可以登录AccessKey管理控制台，申请新增或删除AK对。每个AK对都有active/inactive两种状态。
            Active 表明用户的 AK 处于激活状态，可以在身份验证的时候使用。
            Inactive 表明用户的 AK 处于非激活状态，不能在身份验证的时候使用。
    RAM子账号AccessKey
RAM (Resource Access Management) 是阿里云提供的资源访问控制服务。RAM账号AK指的是通过RAM被授权的AK。这组AK只能按照RAM定义的规则去访问Bucket里的资源。通过RAM，您可以集中管理您的用户（比如员工、系统或应用程序），以及控制用户可以访问您名下哪些资源的权限。比如能够限制您的用户只拥有对某一个Bucket的读权限。
            子账号是从属于主账号的，并且这些账号下不能拥有实际的任何资源，所有资源都属于主账号。

    STS账号AccessKey
STS（Security Token Service）是阿里云提供的临时访问凭证服务。STS账号AK指的是通过STS颁发的AK。
            这组AK只能按照STS定义的规则去访问Bucket里的资源。

当用户以个人身份向OSS发送请求时，其身份验证的实现如下：
    1）用户将发送的请求按照OSS指定的格式生成签名字符串。
    2）用户使用AccessKeySecret对签名字符串进行加密产生验证码。
    3）OSS收到请求以后，通过AccessKeyId找到对应的AccessKeySecret，以同样的方法提取签名字符串和验证码。
        如果计算出来的验证码和提供的一样即认为该请求是有效的。
        否则，OSS将拒绝处理这次请求，并返回HTTP 403错误。
权限控制
针对存放在Bucket的Object的访问，OSS提供了多种权限控制，主要有：
        Bucket级别权限
Object级别权限
账号级别权限（RAM）
        临时账号权限（STS）

Bucket权限类型
OSS提供ACL（Access Control List）权限控制方法，OSS ACL提供Bucket级别的权限访问控制，Bucket目前有三种访问权限：
        public-read-write:  所有这些操作产生的费用由该Bucket的Owner承担，请慎用该权限。
        public-read :       只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行写/删除操作；任何人（包括匿名访问）可以对Object进行读操作。
        private ：          只有该Bucket的Owner或者授权对象可以对存放在其中的Object进行读/写/删除操作；其他人在未经授权的情况下无法访问该Bucket内的Object。

账号级别权限（RAM）
    使用场景
如果您购买了云资源，您的组织里有多个用户需要使用这些云资源，这些用户只能共享使用您的云账号AccessKey。这里有两个问题：
        您的密钥由多人共享，泄露的风险很高。
        您无法控制特定用户能访问哪些资源（比如Bucket）的权限。
    解决方法：在您的阿里云账号下面，通过RAM可以创建具有自己AccessKey的子用户。
        您的阿里云账号被称为主账号，
        创建出来的账号被称为子账号，使用子账号的AccessKey只能使用主账号授权的操作和资源。
临时账号权限（STS）
    使用场景
对于您本地身份系统所管理的用户，比如您的App的用户、您的企业本地账号、第三方App，也有直接访问OSS资源的可能，将这部分用户称为联盟用户。此外，用户还可以是您创建的能访问您的阿里云资源的应用程序。
        对于这部分联盟用户，通过阿里云STS (Security Token Service) 服务为阿里云账号（或RAM用户）提供短期访问权限管理。您不需要透露云账号（或RAM用户）的长期密钥（如登录密码、AccessKey），只需要生成一个短期访问凭证给联盟用户使用即可。这个凭证的访问权限及有效期限都可以由您自定义。您不需要关心权限撤销问题，访问凭证过期后会自动失效。
    用户通过STS生成的凭证包括安全令牌(SecurityToken)、临时访问密钥(AccessKeyId, AccessKeySecret)。
        使用AccessKey方法与您在使用阿里云账户或RAM用户AccessKey发送请求时的方法相同。
        此外还需要注意的是在每个向OSS发送的请求中必须携带安全令牌。
RAM和STS授权策略（Policy）配置
    {
        "Version": "1",
            "Statement": [
            {
                "Action": [
                    "oss:GetBucketAcl",
                    "oss:ListObjects"
                ],
                "Resource": [
                    "acs:oss:*:1775305056529849:mybucket"
                ],
                "Effect": "Allow",
                "Condition": {
                    "StringEquals": {
                        "acs:UserAgent": "java-sdk",
                        "oss:Prefix": "foo"
                    },
                    "IpAddress": {
                        "acs:SourceIp": "192.168.0.1"
                    }
                }
            },
            {
                "Action": [
                    "oss:PutObject",
                    "oss:GetObject",
                    "oss:DeleteObject"
                ],
                "Resource": [
                    "acs:oss:*:1775305056529849:mybucket/file*"
                ],
                "Effect": "Allow",
                "Condition": {
                    "IpAddress": {
                        "acs:SourceIp": "192.168.0.1"
                    }
                }
            }
        ]
    }
    Policy当中有一个Statement（一条Policy当中可以有多条Statement）。
    Statement里面规定了相应的Action、Resource、Effect和Condition。
        这条Policy把用户自己名下的mybucket和mybucket/file*这些资源授权给相应的用户，
        并且支持GetBucketAcl、GetBucket、PutObject、GetObject和DeleteObject这几种操作。
        Condition中的条件表示UserAgent为“java-sdk”，源ip为“192.168.0.1”的时候鉴权才能通过，被授权的用户才能访问相关的资源。
        Prefix这个Condtion是在GetBucket（ListObjects）的时候起作用的，关于这个字段的解释详见OSS的API文档。
    Action 分为三大类：
        Service级别操作，对应的是GetService操作，用来列出所有属于该用户的Bucket列表。
        Bucket级别操作，对应类似于oss:PutBucketAcl、oss:GetBucketLocation之类的操作，操作的对象是Bucket，它们的名称和相应的接口名称一一对应。
        Object级别操作，分为oss:GetObject、oss:PutObject、oss:DeleteObject和oss:AbortMultipartUpload，操作对象是Object。
    Resource指代的是OSS上面的某个具体的资源或者某些资源（支持*通配），
        resource的规则是acs:oss:{region}:{bucket_owner}:{bucket_name}/{object_name}。
        对于所有Bucket级别的操作来说不需要最后的斜杠和{object_name}，即acs:oss:{region}:{bucket_owner}:{bucket_name}。
        Resource也是一个列表，可以有多个Resource。其中的region字段暂时不做支持，设置为“*”。
    Effect代表本条的Statement的授权的结果，分为Allow和Deny，分别指代通过和禁止。
        多条Statement同时匹配成功时，禁止（Deny）的优先级更高。
    Condition代表Policy授权的一些条件，上面的示例里面可以设置对于acs:UserAgent的检查、acs:SourceIp的检查，还有oss:Prefix这项用来在GetBucket的时候对资源进行限制。
        acs:SourceIp	指定ip网段	                普通的ip，支持*通配
        acs:UserAgent	指定http useragent头	    字符串
        acs:CurrentTime	指定合法的访问时间	        ISO8601格式
        acs:SecureTransport	是否是https协议	        “true”或者”false”
        oss:Prefix	    用作ListObjects时的prefix	合法的object name
